package com.jia.leetCode;

import java.util.ArrayList;
import java.util.List;


/**
 * 417. 太平洋大西洋水流问题
 *
 * 有一个 m × n 的矩形岛屿，与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界，而 “大西洋” 处于大陆的右边界和下边界。
 *
 * 这个岛被分割成一个由若干方形单元格组成的网格。给定一个 m x n 的整数矩阵 heights ， heights[r][c] 表示坐标 (r, c) 上单元格 高于海平面的高度 。
 *
 * 岛上雨水较多，如果相邻单元格的高度 小于或等于 当前单元格的高度，雨水可以直接向北、南、东、西流向相邻单元格。水可以从海洋附近的任何单元格流入海洋。
 *
 * 返回网格坐标 result 的 2D 列表 ，其中 result[i] = [ri, ci] 表示雨水从单元格 (ri, ci) 流动 既可流向太平洋也可流向大西洋 。
 *
 *
 *
 * 示例 1：
 *
 *
 *
 * 输入: heights = [[1,2,2,3,5],[3,2,3,4,4],[2,4,5,3,1],[6,7,1,4,5],[5,1,1,2,4]]
 * 输出: [[0,4],[1,3],[1,4],[2,2],[3,0],[3,1],[4,0]]
 * 示例 2：
 *
 * 输入: heights = [[2,1],[1,2]]
 * 输出: [[0,0],[0,1],[1,0],[1,1]]
 *
 *
 * 提示：
 *
 * m == heights.length
 * n == heights[r].length
 * 1 <= m, n <= 200
 * 0 <= heights[r][c] <= 105
 */
public class Pro0417 {
    static int[] dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1};
    int[][] h;
    int n, m;

    public List<List<Integer>> pacificAtlantic(int[][] heights) {
        h = heights;
        n = heights.length;
        m = heights[0].length;
        boolean[][] p = new boolean[n][m], a = new boolean[n][m];
        for (int i = 0; i < n; i++) {
            dfs(i, 0, p);
        }
        for (int j = 1; j < m; j++) {
            dfs(0, j, p);
        }
        for (int i = 0; i < n; i++) {
            dfs(i, m - 1, a);
        }
        for (int j = 0; j < m - 1; j++) {
            dfs(n - 1, j, a);
        }

        List<List<Integer>> ans = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                if (p[i][j] && a[i][j]) {
                    List<Integer> list = new ArrayList<>();
                    list.add(i);
                    list.add(j);
                    ans.add(list);
                }
            }
        }
        return ans;
    }

    public void dfs(int r, int c, boolean[][] ocean) {
        if (ocean[r][c]) return;
        ocean[r][c] = true;
        for (int i = 0; i < 4; i++) {
            int nr = dx[i] + r, nc = dy[i] + c;
            if (nr >= 0 && nr < n && nc >= 0 && nc < m && h[nr][nc] >= h[r][c]) {
                dfs(nr, nc, ocean);
            }
        }
    }
}
